package com.whjfxx.terminal.utils;

import com.whjfxx.terminal.enums.IEnum;

import java.util.Objects;

/**
 * Created by b.c on 2022/5/19 14:51
 */
public class EnumUtils {

    /**
     * 格式化枚举值
     * @param em
     * @param args
     * @return
     */
    public static String formatEnumValue(IEnum em, Object... args) {
        return String.format(em.getDesc(), args);
    }

    /**
     * 根据value获取枚举对象，带缺省值
     * @param code
     * @param clazz
     * @param defaultEnum
     * @return
     */
    public static <E extends IEnum> E getEnumByValue(String code, Class<E> clazz, E defaultEnum) {
        for (E ienum : clazz.getEnumConstants()) {
            if (ienum.getCode().equals(code)) {
                return ienum;
            }
        }
        return defaultEnum == null ? null : defaultEnum;
    }

    /**
     * 根据value获取枚举对象，不带缺省值
     * @param code
     * @param clazz
     * @return 如果没找到，则返回null
     */
    public static <E extends IEnum> E getEnumByValue(String code, Class<E> clazz) {
        return getEnumByValue(code, clazz, null);
    }

    /**
     * 根据枚举类型和value，获取描述，如果没找到，则返回空
     * @param code
     * @param clazz
     * @return
     */
    public static String getDescriptionByValue(String code, Class<? extends IEnum> clazz) {
        IEnum ienum = getEnumByValue(code, clazz);
        if (ienum != null) {
            return ienum.getDesc();
        }
        return "";
    }

    /**
     *
     * @param code
     * @param es
     * @return
     */
    public static <E extends IEnum> boolean inValue(String code, E ... es) {
        Objects.requireNonNull(code);
        for (E e : es) {
            if (isValue(code, e)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 是否等于枚举 value
     * @param code
     * @param e
     * @param <E>
     * @return
     */
    public static <E extends IEnum> boolean isValue(String code, E e) {
        Objects.requireNonNull(code);
        Objects.requireNonNull(e);
        return e.getCode().equals(code);
    }

}
